﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using ServCSS.ServCSS.Cliente;
using ServCSS.ServCSS;

using System.Threading;

namespace ServCSS.ChatMan.ChatMan_cliente
{
    class CChatMan_cli
    {
        CCliente Cliente;
        CChatMan_cliDatos data;
        public CChatMan_cli()
        {
            Console.WriteLine("cli_ChatMan: Iniciando Cliente");
            Console.Write("cli_ChatMan: Indique IP server: ");
            string a =  Console.ReadLine();
            
            Cliente = new CCliente(a, 7300);
            data = new CChatMan_cliDatos();
        }

        public void Run()
        {
            IniciarConexion();

            Thread escucha = new Thread(new ThreadStart(escuchaServer));
            escucha.Start();

            Chatear();
        }

        private void IniciarConexion()
        {
            try
            {
                Console.WriteLine("cli_ChatMan: Intentando establecer sesion");

                CPaq_Asignacion paq_Asig = new CPaq_Asignacion();
                CPaq_Genric paq_gen = new CPaq_Genric();
                paq_gen.peticion = "Conectar";
                paq_gen.ID = -1;

                byte[] paqByte = new byte[1024];
                
                paqByte = CSRepositor.Empaquetar((object)paq_gen);

                Cliente.data.socket.Send(paqByte);

                Console.WriteLine("cli_ChatMan: Paquete de Inicio de Sesion enviado");
                Console.WriteLine("cli_ChatMan: Esperando nuevos datos de conexion");

                //espera paquete con nuevos datos de conexion
                paqByte = new byte[1024];
                Cliente.data.socket.Receive(paqByte);
                paq_Asig = (CPaq_Asignacion)CSRepositor.Desempaquetar(paqByte);

                Console.WriteLine("cli_ChatMan: Nuevos Datos de conexion recibidos");
                //asignamos nuevo socket de contacto con el sv
               // Cliente.nuevoSock(paq_Asig.nuevoServer, paq_Asig.nuevoPuerto);
                Cliente.nuevoSock(paq_Asig.nuevoServer, paq_Asig.nuevoPuerto);
                paq_gen.peticion = "OK!, Cliente ChatMan vivito y coleando";
                paqByte = CSRepositor.Empaquetar((object)paq_gen);
                Cliente.data.socket.Send(paqByte);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
            
        }

        private void escuchaServer()
        {
            try
            {
                Console.WriteLine("cli_ChatMan: Escuchando al servidor para escribir mensajes de otros Usuarios");
                byte[] paqByte = new byte[1024];
                CPaq_Msg mensaje = new CPaq_Msg();
                while (true)
                {
                    Cliente.data.socket.Receive(paqByte);
                    mensaje = (CPaq_Msg)CSRepositor.Desempaquetar(paqByte);
                    //regreso a inicializar el array de bytes
                    paqByte = new byte[1024];

                    Console.WriteLine("Usuario " + mensaje.ID + " :" + mensaje.msg);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }

        private void Chatear()
        {
            try
            {
                Console.WriteLine("cli_ChatMan: Empieza a chatear por ChatMan, Line y Whatsapp la tienen adentro");
                CPaq_Msg mensaje = new CPaq_Msg();
                byte[] paqByte;
                string mensajeSend;
                while (true)
                {
                    Console.Write("Cliente " + data.ID + ": ");
                    mensajeSend = Console.ReadLine();
                
                    //empaquetamos el mensaje y lo enviamos
                    paqByte = new byte[1024];
                    mensaje.msg = mensajeSend;
                    mensaje.ID = data.ID;
                    paqByte = CSRepositor.Empaquetar((object)mensaje);
                
                    //enviar paquete
                    Cliente.data.socket.Send(paqByte);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
    }
}
